home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / ARexxTools / RexxEvent1_21.lha / RexxEvent / RexxEvent.e < prev    next >
Encoding:
Text File  |  1995-04-23  |  5.2 KB  |  231 lines

  1. -> RexxEvent.e © 1995 by Leon Woestenberg.
  2.  
  3. -> This is Freeware. You may use (parts of) the code, but you may not
  4. -> re-compile this code and spread the results under the name `RexxEvent'
  5. -> or similar. Make up a quite unique name instead.
  6.  
  7. -> Please support Freeware :-)
  8.  
  9. -> Once started, sending an commodity-style input description to the
  10. -> ARexx port 'REXXEVENT' will cause this event to happen.
  11.  
  12. -> Examples: rx 'ADDRESS REXXEVENT "<ctrl alt r>Only Amiga..."'
  13.  
  14. OPT PREPROCESS
  15.  
  16. MODULE 'dos/dos'
  17. MODULE 'exec/nodes'
  18. MODULE 'exec/ports'
  19. MODULE 'commodities'
  20. MODULE 'libraries/commodities'
  21. MODULE 'rexxsyslib'
  22. MODULE 'rexx/storage'
  23. MODULE 'devices/inputevent'
  24. MODULE 'devices/timer'
  25.  
  26. MODULE 'amigalib/cx'
  27.  
  28. MODULE '*RexxEvent_rev'
  29.  
  30. MODULE 'tools/debug'
  31. MODULE '*E:Modules/dd_debugoff'
  32.  
  33. OBJECT commodity
  34.   cxbroker
  35.   cxport:PTR TO mp
  36.   enabled
  37. ENDOBJECT
  38.  
  39. OBJECT arexx
  40.   port:PTR TO mp
  41. ENDOBJECT
  42.  
  43. DEF commodity:PTR TO commodity
  44. DEF arexx:PTR TO arexx
  45.  
  46. -> FOLD main
  47. PROC main()
  48.   DEF signals,quitflag=FALSE
  49.   NEW commodity
  50.   IF commodity.new()
  51.     KPUTSTR('commodity broker active.\n')
  52.     NEW arexx
  53.     IF arexx.new()
  54.       KPUTSTR('Waiting.\n')
  55.       WHILE signals:=Wait(commodity.sigmask() OR
  56.                           arexx.sigmask() OR
  57.                           SIGBREAKF_CTRL_C)
  58.         -> KRESET
  59.         KPUTSTR('Signalled.\n')
  60.         IF signals AND commodity.sigmask()
  61.           quitflag:=commodity.handle()
  62.         ENDIF
  63.         IF signals AND arexx.sigmask()
  64.           quitflag:=quitflag OR arexx.handle()
  65.         ENDIF
  66.         IF signals AND SIGBREAKF_CTRL_C
  67.           quitflag:=TRUE
  68.         ENDIF
  69.         EXIT quitflag
  70.         KPUTSTR('Waiting.\n')
  71.       ENDWHILE
  72.       END arexx
  73.     ENDIF
  74.     END commodity
  75.   ENDIF
  76. ENDPROC
  77. -> ENDFOLD
  78. -> FOLD insertEvents()
  79. PROC insertEvents(inputdescr)
  80.   DEF ie:PTR TO inputevent
  81.   IF ie:=invertStringRev(inputdescr,0)
  82.     AddIEvents(ie)
  83.     freeIEvents(ie)
  84.   ENDIF
  85. ENDPROC
  86. -> ENDFOLD
  87. -> FOLD arexx
  88. PROC new() OF arexx
  89.   DEF name
  90.   IF rexxsysbase:=OpenLibrary('rexxsyslib.library',0)
  91.     Forbid()
  92.     IF FindPort(name:='REXXEVENT')
  93.       KPUTSTR('Public port already there.\n')
  94.       self.port:=NIL
  95.     ELSE
  96.       self.port:=CreateMsgPort()
  97.       IF self.port
  98.         KPUTSTR('Public port added.\n')
  99.         self.port.ln.name:=name
  100.         self.port.ln.pri:=0
  101.         AddPort(self.port)
  102.       ENDIF
  103.     ENDIF
  104.     Permit()
  105.   ENDIF
  106. ENDPROC (self.port<>NIL)
  107.  
  108. PROC end() OF arexx
  109.   IF self.port
  110.     RemPort(self.port)
  111.     DeleteMsgPort(self.port)
  112.     self.port:=NIL
  113.   ENDIF
  114.   IF rexxsysbase
  115.     CloseLibrary(rexxsysbase)
  116.     rexxsysbase:=NIL
  117.   ENDIF
  118. ENDPROC
  119.  
  120. PROC sigmask() OF arexx IS Shl(1,self.port.sigbit)
  121.  
  122. PROC handle() OF arexx
  123.   DEF msg:PTR TO rexxmsg
  124.   DEF command
  125.   DEF quitflag=FALSE
  126.   WHILE msg:=GetMsg(self.port)
  127.  
  128.     KPUTSTR('Processing ARexx msg.\n')
  129.     command:=Long(msg.args)
  130.  
  131.     msg.result1:=0
  132.     msg.result2:=NIL
  133.     IF StrCmp('QUIT',command)
  134.       KPUTSTR('Quit.\n')
  135.       quitflag:=TRUE
  136.     ELSE
  137.       KPUTFMT('Input description=\a\s\a\n',[command])
  138.       IF commodity.enabled
  139.         KPUTSTR('Let\as make an input event.\n')
  140.         IF insertEvents(command)=FALSE
  141.           -> set warning result
  142.           msg.result1:=5
  143.         ENDIF
  144.       ENDIF
  145.     ENDIF
  146.     ReplyMsg(msg)
  147.   ENDWHILE
  148. ENDPROC quitflag
  149. -> ENDFOLD
  150. -> FOLD commodity
  151. PROC handle() OF commodity
  152.   DEF cxmsg,cxmsgtype,cxmsgid,cxmsgdata,quitflag=FALSE
  153.   WHILE cxmsg:=GetMsg(self.cxport)
  154.  
  155.     cxmsgtype:=CxMsgType(cxmsg)
  156.     cxmsgid:=CxMsgID(cxmsg)
  157.     cxmsgdata:=CxMsgData(cxmsg)
  158.  
  159.     ReplyMsg(cxmsg)
  160.  
  161.     SELECT cxmsgtype
  162.     CASE CXM_COMMAND
  163.       SELECT cxmsgid
  164.       CASE CXCMD_ENABLE
  165.         KPUTSTR('Enabled.\n')
  166.         self.enabled:=TRUE
  167.       CASE CXCMD_DISABLE
  168.         KPUTSTR('Disabled.\n')
  169.         self.enabled:=FALSE
  170.       CASE CXCMD_UNIQUE
  171.         KPUTSTR('Other `me\a was tried to run, so quit.\n')
  172.         quitflag:=TRUE
  173.       -> CASE CXCMD_APPEAR
  174.       -> CASE CXCMD_DISAPPEAR
  175.       CASE CXCMD_KILL
  176.         KPUTSTR('Kill.\n')
  177.         quitflag:=TRUE
  178.       ENDSELECT
  179.     ENDSELECT
  180.   ENDWHILE
  181. ENDPROC quitflag
  182.  
  183. PROC new() OF commodity
  184.   DEF cxerror
  185.   IF cxbase:=OpenLibrary('commodities.library',0)
  186.     self.cxport:=CreateMsgPort()
  187.     IF self.cxport
  188.       self.cxbroker:=CxBroker([NB_VERSION,
  189.                                NIL,
  190.                                'RexxEvent',
  191.                                'RexxEvent',
  192.                                'Emulates input events via ARexx port',
  193.                                NBU_UNIQUE OR NBU_NOTIFY,
  194.                                0,
  195.                                0,
  196.                                NIL,
  197.                                self.cxport,
  198.                                NIL]:newbroker,{cxerror})
  199.       IF self.cxbroker
  200.         KPUTSTR('broker could be created.\n')
  201.         self.enabled:=TRUE
  202.         ActivateCxObj(self.cxbroker,TRUE)
  203.         RETURN TRUE
  204.       ELSE
  205.         KPUTFMT('CxBroker error=\d\n',[cxerror])
  206.       ENDIF
  207.     ENDIF
  208.   ENDIF
  209. ENDPROC
  210.  
  211. PROC end() OF commodity
  212.   DEF cxmsg
  213.   IF self.cxbroker
  214.     DeleteCxObjAll(self.cxbroker)
  215.     self.cxbroker:=NIL
  216.   ENDIF
  217.   IF self.cxport
  218.     WHILE cxmsg:=GetMsg(self.cxport) DO ReplyMsg(cxmsg)
  219.     DeleteMsgPort(self.cxport)
  220.     self.cxport:=NIL
  221.   ENDIF
  222.   IF cxbase
  223.     CloseLibrary(cxbase)
  224.     cxbase:=NIL
  225.   ENDIF
  226. ENDPROC
  227.  
  228. PROC sigmask() OF commodity IS Shl(1,self.cxport::mp.sigbit)
  229. -> ENDFOLD
  230.  
  231.